/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package daw.controlador;

import daw.bean.Ciudad;
import daw.bean.Delito;
import daw.util.FiltroBusqueda;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceUnit;
import javax.persistence.Query;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.swing.JOptionPane;

/**
 *
 * @author Luis
 */
public class ConsultaDenuncias extends HttpServlet {

	@PersistenceUnit
    private EntityManagerFactory emf;

	public static final String FILTRO_CONSULTA= "filtroConsulta";
    /** 
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
		String operacion;
        try {
			operacion = request.getParameter("operacion");
			if(operacion == null){
				throw new ServletException("No se ha definido valor de operación.");
			}else if(operacion.equals("agregarCriterio")){
				FiltroBusqueda filtro;
				String criterio;
				String valor;
				criterio = request.getParameter("criterio");
				valor = request.getParameter("valor");
				filtro = (FiltroBusqueda)request.getSession().getAttribute(FILTRO_CONSULTA);
				if(filtro == null){
					filtro = new FiltroBusqueda();
					request.getSession().setAttribute(FILTRO_CONSULTA, filtro);
				}
				filtro.agregarCriterio(criterio, valor);
			}else if(operacion.equals("removerCriterio")){
				FiltroBusqueda filtro;
				String criterio;
				String valor;
				criterio = request.getParameter("criterio");
				valor = request.getParameter("valor");
				filtro = (FiltroBusqueda)request.getSession().getAttribute(FILTRO_CONSULTA);
				if(filtro != null){
					filtro.removerCriterio(criterio, valor);
				}
			}else if(operacion.equals("prepararParaConsultar")){
				FiltroBusqueda filtro;
				EntityManager em;
				Ciudad ciudad;
				Delito delito;
				String marca;

				Vector valoresBuscados;
				filtro = (FiltroBusqueda)request.getSession().getAttribute(FILTRO_CONSULTA);
				Iterator iterador;
				em = emf.createEntityManager();
				List ciudades = em.createNamedQuery("Ciudad.findAll").getResultList();
	            List delitos = em.createNamedQuery("Delito.findAll").getResultList();
				List marcas = em.createQuery("Select distinct o.marca from Objeto as o order by o.marca").getResultList();
				em.close();
				List ciudadesSeleccionadas = new ArrayList();
				List delitosSeleccionados = new ArrayList();
				List marcasSeleccionadas = new ArrayList();

				
				if(filtro!=null){

					valoresBuscados = filtro.getFiltros().get("ciudad");
					if(valoresBuscados!=null){
						iterador = ciudades.iterator();
						while(iterador.hasNext()){
							ciudad= (Ciudad)iterador.next();
							if(valoresBuscados.contains(ciudad.getIdCiudad().toString())){
								iterador.remove();
								ciudadesSeleccionadas.add(ciudad);
							}
						}
					}

					valoresBuscados = filtro.getFiltros().get("delito");
					if(valoresBuscados!=null){
						iterador = delitos.iterator();
						while(iterador.hasNext()){
							delito= (Delito)iterador.next();
							if(valoresBuscados.contains(delito.getIdDelito().toString())){
								iterador.remove();
								delitosSeleccionados.add(delito);
							}
						}
					}

					valoresBuscados = filtro.getFiltros().get("marca");
					if(valoresBuscados!=null){
						iterador = marcas.iterator();
						while(iterador.hasNext()){
							marca= (String)iterador.next();
							if(valoresBuscados.contains(marca)){
								iterador.remove();
								marcasSeleccionadas.add(marca);
							}
						}
					}
				}
				request.setAttribute("ciudades", ciudades);
				request.setAttribute("delitos", delitos);
				request.setAttribute("marcas", marcas);

				request.setAttribute("ciudadesSeleccionadas", ciudadesSeleccionadas);
				request.setAttribute("delitosSeleccionados", delitosSeleccionados);
				request.setAttribute("marcasSeleccionadas", marcasSeleccionadas);

				getServletContext().getRequestDispatcher("/servicio/protegido/consultaReporte.jsp").forward(request, response);
			}else if(operacion.equals("consultar")){
				FiltroBusqueda filtro;
				EntityManager em;
				List denuncias;
				Ciudad ciudad;
				Delito delito;
				String marca;
				ArrayList valores;
				Query consulta;
				String sql;
				StringBuilder condicion;
				Vector valoresBuscados;
				boolean primerAnd;
				boolean primerOr;
				Date fechaInicio= null;
				Date fechaFin= null;


				sql = "SELECT d FROM Denuncia d";
				condicion = new StringBuilder();
				valores = new ArrayList();


				filtro = (FiltroBusqueda)request.getSession().getAttribute(FILTRO_CONSULTA);
				Iterator iterador;
				primerAnd = true;

				if(filtro!=null){

					valoresBuscados = filtro.getFiltros().get("delito");
					if(valoresBuscados!=null && valoresBuscados.size()>0){
						if(primerAnd){
							primerAnd = false;
						}else{
							condicion.append(" and ");
						}
						primerOr = true;
						for(int i=0; i< valoresBuscados.size(); i++){
							if(primerOr){
								condicion.append("(");
								primerOr = false;
							}else{
								condicion.append(" or ");
							}
							valores.add(Integer.valueOf(valoresBuscados.get(i).toString()));
							condicion.append("d.delitoSubdelito.delito.idDelito = :p");
							condicion.append(valores.size());
						}
						condicion.append(")");
					}


					valoresBuscados = filtro.getFiltros().get("ciudad");
					if(valoresBuscados!=null && valoresBuscados.size()>0){
						if(primerAnd){
							primerAnd = false;
						}else{
							condicion.append(" and ");
						}
						primerOr = true;
						for(int i=0; i< valoresBuscados.size(); i++){
							if(primerOr){
								condicion.append("(");
								primerOr = false;
							}else{
								condicion.append(" or ");
							}
							//JOptionPane.showMessageDialog(null, "ciudad: "+valoresBuscados.get(i));
							valores.add(Integer.valueOf(valoresBuscados.get(i).toString()));
							condicion.append("d.idArea.idCiudad.idCiudad = :p");
							condicion.append(valores.size());
						}
						condicion.append(")");
					}

					valoresBuscados = filtro.getFiltros().get("marca");
					if(valoresBuscados!=null && valoresBuscados.size()>0){
						if(primerAnd){
							primerAnd = false;
						}else{
							condicion.append(" and ");
						}
						primerOr = true;
						for(int i=0; i< valoresBuscados.size(); i++){
							if(primerOr){
								condicion.append("(exists (select o from objeto o where d.idDenuncia = o.idDenuncia and (");
								primerOr = false;
							}else{
								condicion.append(" or ");
							}
							//JOptionPane.showMessageDialog(null, "ciudad: "+valoresBuscados.get(i));
							valores.add(valoresBuscados.get(i));
							condicion.append("o.marca = :p");
							condicion.append(valores.size());
						}
						condicion.append(")))");
					}

				}

				SimpleDateFormat parser = new SimpleDateFormat("dd-MM-yyyy");
				String sdesde;
				String shasta;
				sdesde = request.getParameter("desde");
				if(sdesde!=null && sdesde.length()>0){
					fechaInicio = parser.parse(sdesde);
				}
				shasta = request.getParameter("hasta");
				if(shasta!=null && shasta.length()>0){
					fechaFin = parser.parse(shasta);
				}

				if(fechaInicio!=null || fechaFin!=null){
					if(primerAnd){
						primerAnd = false;
					}else{
						condicion.append(" and ");
					}
					if(fechaInicio!=null){
						if(fechaFin!=null){
							valores.add(fechaInicio);
							condicion.append("(d.fechaDelito between :p"+valores.size());
							valores.add(fechaFin);
							condicion.append(" and :p"+valores.size());
						}else
						{
							valores.add(fechaInicio);
							condicion.append("(d.fechaDelito >= :p"+valores.size());
						}
					}else{
						valores.add(fechaFin);
						condicion.append("(d.fechaDelito<= :p"+valores.size());
					}
					condicion.append(")");
				}

				if(condicion.length()>0){
					sql = sql + " where "+condicion;
				}

				em = emf.createEntityManager();
				//JOptionPane.showMessageDialog(null, sql);
				consulta = em.createQuery(sql);
				

				for(int i=0; i<valores.size(); i++){
					consulta.setParameter("p"+(i+1), valores.get(i));
				}
				denuncias = consulta.getResultList();
				em.close();
				request.setAttribute("denuncias", denuncias);
				//JOptionPane.showMessageDialog(null, ""+denuncias.size());
				getServletContext().getRequestDispatcher("/servicio/protegido/resultadoConsulta.jsp").forward(request, response);
			}
        }catch(Exception e){
			e.printStackTrace(response.getWriter());
		}finally {
            out.close();
        }
    }




    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /** 
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    } 

    /** 
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

}
